package com.lhy.admin.gen;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.Collections;
import java.util.Properties;

/**
 * MybatisPlusCodeGen 代码生成器 可以生成 mapper xml service entity controller，生成的代码自带常用增删改查方法
 *
 * @author hyluan
 * @date 2022/6/24 19:10
 */
@Slf4j
public class MybatisPlusCodeGen {

    private static final Properties CONFIG = ConfigUtil.getConfig();

    public static void main(String[] args) {
        /**
         * 数据库地址
         */
        String host = CONFIG.getProperty("jdbc.host");
        /**
         * 数据库端口
         */
        String port = CONFIG.getProperty("jdbc.port");
        /**
         * 数据库db
         */
        String database = CONFIG.getProperty("jdbc.database");
        /**
         * 账号
         */
        String username = CONFIG.getProperty("jdbc.username");
        /**
         * 密码
         */
        String password = CONFIG.getProperty("jdbc.password");

        /**
         * 项目地址 按需修改
         */
        String outputDir = CONFIG.getProperty("gen.outputDir");
        /**
         * 包名
         */
        String author = CONFIG.getProperty("gen.author");
        //包名
        String parent = CONFIG.getProperty("gen.package");
        //模块名
        String moduleName = CONFIG.getProperty("gen.moduleName");
        //表名
        String[] tableNames = CONFIG.getProperty("gen.tables").split(",");

        log.info("----------开始生成代码-------------");
        File file = new File(outputDir);
        String absolutePath = file.getAbsolutePath();
        FastAutoGenerator.create("jdbc:mysql://" + host + ":" + port + "/" + database + "?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull", username, password)
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir() //不打开目录
                            .outputDir(absolutePath); // 指定输出目录
                })
                .packageConfig(builder -> {

                    String mapperPath = absolutePath + "\\" + parent.replaceAll("\\.", "\\\\") + "\\" + moduleName + "\\" + "mapper";
                    builder.parent(parent) // 设置父包名
                            .moduleName(moduleName) // 设置父包模块名
                            .serviceImpl("service")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath)); // 设置mapperXml生成路径
                })
                .templateConfig(builder -> {
                    builder.disable(TemplateType.SERVICE)
                            .serviceImpl("/templates/MyServiceImpl.java")
                            .entity("/templates/MyEntity.java")
                            .controller("/templates/MyController.java")
                            .build();
                })
                .strategyConfig(builder -> {
                    builder.addInclude(tableNames);// 设置需要生成的表名
//                            .addTablePrefix("t_"); // 设置过滤表前缀
                    builder.serviceBuilder()
                            .formatServiceImplFileName("%sService")
                            .build();
                    builder.controllerBuilder()
                            .superClass("com.lhy.admin.common.mvcplus.controller.SimpleCrudControllerSupport")
                            .enableRestStyle().build();

                    builder.entityBuilder().enableChainModel().enableLombok().enableTableFieldAnnotation()
                            .idType(IdType.INPUT);
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
        log.info("----------生成完毕-------------");
    }
}
